#include <iostream>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>

int main()
{
    // 如果不关心子进程退出，但又不产生僵尸，设置对SIGCHLD进行忽略即可
    // 系统默认是ign，要自己设置的原因是：系统层面和用户层面
    // 用户的和系统的处理是不一样的
    signal(SIGCHLD, SIG_IGN);
    pid_t id = fork();
    if (id == 0)
    {
        int cnt = 5;
        while (cnt)
        {
            std::cout << "child running" << std::endl;
            cnt--;
            sleep(1);
        }

        exit(1);
    }
    while (true)
    {
        std::cout << "father running" << std::endl;
        sleep(1);
    }
}

// // 挑问题了
// // 问题1: 如果一共有10个子进程，且同时退出，用while循环，一直回收
// // 问题2: 如果一共有10个子进程, 5个退出，5个永远不退出，非阻塞的方法
// void notice(int signo)
// {
//     std::cout << "get a signal: " << signo << " pid: " << getpid() << std::endl;
//     // 一直回收
//     while (true)
//     {
//         pid_t rid = waitpid(-1, nullptr, WNOHANG); // 阻塞啦！！--> 非阻塞方式
//         if (rid > 0)
//         {
//             std::cout << "wait child success, rid: " << rid << std::endl;
//         }
//         else if (rid < 0)
//         {
//             std::cout << "wait child success done " << std::endl;
//             break;
//         }
//         else
//         {
//             std::cout << "wait child success done " << std::endl;
//             break;
//         }
//     }
// }

// void DoOtherThing()
// {
//     std::cout << "DoOtherThing~" << std::endl;
// }
// int main()
// {
//     signal(SIGCHLD, notice);
//     for (int i = 0; i < 10; i++)
//     {
//         pid_t id = fork();
//         if (id == 0)
//         {
//             std::cout << "I am child process, pid: " << getpid() << std::endl;
//             sleep(3);
//             exit(1);
//         }
//     }
//     // father
//     while (true)
//     {
//         DoOtherThing();
//         sleep(1);
//     }

//     return 0;
// }

// // 强制内存和磁盘进行通信，使gflag的数据可以被更新
// volatile int gflag = 0;

// void changedata(int signo)
// {
//     std::cout << "get a signo:" << signo << ", change gflag 0->1" << std::endl;
//     gflag = 1;
// }

// int main() // 没有任何代码对gflag进行修改！！！
// {
//     signal(2, changedata);

//     while(!gflag); // while不要其他代码
//     std::cout << "process quit normal" << std::endl;
// }